package domotica.house.manager;
import javax.jws.*;
import java.util.*;

import javax.xml.ws.soap.Addressing;
import com.sun.xml.ws.developer.*;

import domotica.house.automation.Parameter;

/**
 * Classe fondamentale per l'interazione server-utente.
 * 
 * Tutte le richieste mosse verso il server devono passare attraverso questa classe, assicurando che sia necessario il login
 * prima di accedere alle funzionalita' messe a disposizione dal software.
 * 
 * L'istanza di questa classe e' ottenuta attraverso login di HouseManager.
 * 
 * Tutte le richieste indirizzate a questa classe vengono inoltrate all'istanza di HouseManager che si 
 * occupa di dirigerle verso i componenti adatti o di rispondervi direttamente.
 */

@WebService @Stateful @Addressing
public class HouseOwner {
	
	public static StatefulWebServiceManager<HouseOwner> manager;
	
	private String username;
	private String password;
	private HouseManager houseManager;
	
	public HouseOwner(String user, String psw, HouseManager hm){
		
		this.username = user;
		this.password = psw;
		this.houseManager = hm;
		
	}
	
	/**
	 * Restituisce i nomi di tutti gli ActuatorSensor
	 */
	public List<String> getActuatorsSensorsNameList(){
		return this.houseManager.getActuatorsSensorsNameList();
	}
	
	/**
	 * Restituisce la lista di parametri necessari ad un ActuatorSensor per la definizione di un task
	 */
	public List<Parameter> getActuatorSensorTaskDesiredParameterList(String actuatorSensorName){
		return this.houseManager.getActuatorSensorTaskDesiredParameterList(actuatorSensorName);		
	}
	
	/**
	 * Restituisce i nomi di tutte le variabili monitorate dai componenti collegati
	 */
	public List<String> getEnvironmentVariablesNames(){
		return this.houseManager.getEnvironmentVariablesNames();
	}
	
	/**
	 * Restituisce il valore di tutte le variabili monitorate dai componenti collegati
	 */
	public List<Double> getEnvironmentVariables(){
		return this.houseManager.getEnvironmentVariables();
	}
	
	public boolean isActuatorSensorOn(String actuatorSensorName){
		return this.houseManager.isActuatorSensorOn(actuatorSensorName);
	}
	
	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}
	
	/**
	 * Definisce un nuovo task per il componente secondo i parametri passati
	 */
	public void addActuatorSensorTask(String actuatorSensorName, List<String> parameterList){
		this.houseManager.addActuatorSensorTask(actuatorSensorName, parameterList);
	}
	
	/**
	 * Blocca il task del componente desiderato 
	 */
	public void stopTask(String actuatorSensorName){
		this.houseManager.stopTask(actuatorSensorName);
	}
	
}
